//#include <base.js>
//#include <openlayersExt.js>
//#include <event.js>


/**
* 
* Classe CWN2.MapBuilder - Build the Openlayers.Map
* 
* @namespace CWN2
* @class MapBuilder
* 
*/

CWN2.MapBuilder = {
	
	/**
	* 
	* Build the OL Map
	* 
	* @method build
	* 
	* @param {String} div Name of the div  
	* 
	*/ 
	
	build: function(div) {
		
		if (CWN2.base.DEBUG) {
			console.log('CWN2.MapBuilder.build');
		}

		var config = CWN2.configuration;
		
		// imposto le mapOptions
		var mapOptions = config.mapOptions;
		// azzero i controlli della mappa OL - altrimenti fa vedere il controllo PanZoom sempre
		mapOptions.controls=[];

		// Creo la mappa OL
		CWN2.base.map = new OpenLayers.Map(div,mapOptions)		

		// Inizializzo i controlli per la mappa OL
		this.initControls(config.widgets);

		// Carico i layers alla mappa OL
		this.loadLayers(config.layers);

		// Vado allo zoom iniziale
		if(!CWN2.base.map.getCenter()){
			CWN2.base.map.zoomToMaxExtent();
		}
		
		// test per livello WMS
		if (CWN2.base.DEBUG) {
			var map = CWN2.base.map;
			var layerWMS = map.getLayersByName("Province")[0];
			if (layerWMS) {
				console.log('URL WMS Livello ' + layerWMS.getURL(layerWMS.getExtent()));
			}
		}

	},
	
	/**
	* 
	* Add an array of layers to the map. 
	* 
	* @method loadLayers
	* @param [{layerConfig}] layers Array of layerConfig objects 
	* 
	*/    
	
    loadLayers: function (layers) {
		
		if (CWN2.base.DEBUG) {
			console.log('CWN2.MapBuilder.loadLayers');
		}

		// aggiungo i layers alla mappa OL
		for (var i = 0; i < layers.length; i++) {
			this.loadLayer(layers[i]);
		}

	},	

	/**
	* 
	* Add a layer to the map. 
	* 
	* @method loadLayer
	* @param {layerConfig} layerConfig A layerConfig object 
	* 
	*/    

    loadLayer: function (layerConfig) {
	
    	if (CWN2.base.DEBUG) {
			console.log('CWN2.MapBuilder.loadLayer');
		}	

    	// creo il layer OL e lo aggiungo alla mappa
		CWN2.base.map.addLayer(CWN2.layerFactory.createLayer(layerConfig));
		
	},	
	
	/**
	* 
	* Initialize and load the controls of the map. 
	* 
	* @method initControls
	* @param [{controlsConfig}] controls Array of controlsConfig objects 
	* 
	*/    
	
    initControls: function (widgetsConfig) {
		
		// Carico i controlli base
		baseControlConfig = [
			{   
				"type": "Navigation"
			},
			{   
				"type": "ArgParser"
			},
			{   
				"type": "Attribution"
			},
			{   
				"type": "KeyboardDefaults"
			}
		];
		this.loadControls(baseControlConfig);
		
		// registro il controllo per la selezione delle feature dei livelli vettoriali
		this.activateSelectFeatureControl();

		// Carico i controlli dalla configurazione
		this.loadControls(widgetsConfig);

	},	

	/**
	* 
	* Add an array of controls to the map. 
	* 
	* @method loadControls
	* @param [{controlConfig}] controls Array of controlConfig objects 
	* 
	*/    
	
    loadControls: function (controls) {
		
		if (CWN2.base.DEBUG) {
			console.log('CWN2.MapBuilder.loadControls');
		}

		// aggiungo i controlli alla mappa OL
		for (var i = 0; i < controls.length; i++) {
			if (controls[i].type === "control") {
				this.loadControl(controls[i]);
			}
		}

	},	

	/**
	* 
	* Add a control to the map. 
	* 
	* @method loadControl
	* @param {controlConfig} controlConfig A controlConfig object 
	* 
	*/    

    loadControl: function (controlConfig) {
	
    	if (CWN2.base.DEBUG) {
			console.log('CWN2.MapBuilder.loadControl');
		}

    	// creo il controllo OL e lo aggiungo alla mappa
		var olControl = CWN2.controlFactory.createControl(controlConfig);
		CWN2.base.map.addControl(olControl);
		return olControl;
		
	},	

	/**
	* 
	* Activate the select feature control for all the vector layers of the map. 
	* 
	* @method activateSelectFeatureControl
	* 
	*/ 
	
    activateSelectFeatureControl: function () {
		
		if (CWN2.base.DEBUG) {
			console.log('CWN2.MapBuilder.activateSelectFeatureControl');
		}

		var map = CWN2.base.map;
		
		// carico l'array con i layer vettoriali
		var vectLayerArray = [];
		for (var i = 0; i < map.layers.length; i++) {
			if (map.layers[i].CLASS_NAME==='OpenLayers.Layer.Vector') {
				map.layers[i].events.on({
				    'featureselected': CWN2.event.onFeatureSelect,
				    'featureunselected': CWN2.event.onFeatureUnselect
				});
				vectLayerArray.push(map.layers[i]);
			}
		}
		// attivo il controllo
		var select_feature_control = new OpenLayers.Control.SelectFeature(vectLayerArray);
		map.addControl(select_feature_control);
		select_feature_control.activate();
		
	}			
	
};	
	

